package locadora.model;

/**
 * Classe que representa um Item para locação
 * @author Leonardo Rocha Dias
 * @author Marccelo Augusto Selvaggio
 * @version 9.11-09
 * @see Filme
 * @see Jogo
 * @since 2009
 */
public abstract class Item implements ItemLocacao {

    // TODO devo implementar os métodos da interface ItemLocacao nesta classe ?
    // TODO devo implementar tratamento para não permitir nome em branco ?
    // TODO devo implementar tratamento para passar para maiúscula o nome, pois altera o hashCode ?
    // TODO devo implementar tratamento para não permitir nome com menos de x caracteres ?
    
    // <editor-fold defaultstate="collapsed" desc=" Atributos ">
    private String nome;
    private boolean disponivel;
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc=" Construtores ">
    /**
     * Construtor Padrão
     
    private Item() {
        super();
    }*/

    /**
     * Constroi um item com o nome do título
     * @param nome do título do item
     */
    public Item(String nomeTitulo) {
        this.nome = nomeTitulo;
        this.disponivel = true;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc=" Propriedades ">
    /**
     * Retorna o valor de nome do título
     *
     * @return o valor de nome do  título
     */
    @Override
    public String getNome() {
        return nome;
    }

    /**
     * Define o valor de nome do título
     *
     * @param nome novo valor de nome do título
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * Retorna o valor de disponivel
     *
     * @return o valor de disponivel
     */
    @Override
    public boolean isDisponivel() {
        return disponivel;
    }

    /**
     * Define o valor disponivel
     *
     * @param disponivel novo valor de disponivel
     */
    public void setDisponivel(boolean disponivel) {
        this.disponivel = disponivel;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc=" Métodos Sobrescritos ">

    @Override
    public boolean alugar() {

        boolean resultado = false;

        if (this.disponivel) {
            this.disponivel = false;
            resultado = true;
        }

        return resultado;

    }

    @Override
    public boolean devolver() {

        boolean resultado = false;

        if (! this.disponivel) {
            this.disponivel = true;
            resultado = true;
        }

        return resultado;
    }

    /**
     * Retorna se o um item é igual a outro com base no nome do título
     * @param obj que representa um item
     * @return verdadeiro se o nome do título desse item for igual ao outro ou falso caso contrário
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Item other = (Item) obj;
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
        return true;
    }

    /**
     * Gera o codigo hash com base no título do item
     * utilizado para identificação em conjuntos
     * @return o codigo hash
     */
    @Override
    public int hashCode() {
        int hash = 5;
        hash = 89 * hash + (this.nome != null ? this.nome.hashCode() : 0);
        return hash;
    }

    /**
     * Representa a string do objeto Item
     * @return uma string contendo informações do Item
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        String separadorLinha = System.getProperty("line.separator");

        sb.append(this.getClass().getSimpleName());
        sb.append(separadorLinha);

        sb.append("Título: ");
        sb.append(this.nome);

        sb.append(separadorLinha);

        sb.append("Disponibilidade: ");
        sb.append(this.disponivel ? "Sim" : "Não");

        sb.append(separadorLinha);

        return sb.toString();
    }
    // </editor-fold>

}
